package top.milkbox.utils;


/**
 * 有关变量名的字符串的操作工具
 * <p>
 * 创建时间：2022年9月30日13:12:54
 *
 * @author milkbox
 * @version 1.0.0
 */
public class GuoUtilsVariableName {

    /**
     * 常量
     *
     * @param string
     * @return
     */
    public static String getConstant(String string) {
        return GuoUtilsVariableName.getCustom(
                string, '_', true, false, true
        );
    }

    /**
     * 烤肉串格式，中划线格式
     *
     * @param string 原字符串
     * @return 中划线格式
     */
    public static String getBarbecue(String string) {
        return GuoUtilsVariableName.getCustom(
                string, '-', false, false, false
        );
    }

    /**
     * 下划线格式
     *
     * @param string 原字符串
     * @return 下划线格式
     */
    public static String getUnderline(String string) {
        return GuoUtilsVariableName.getCustom(
                string, '_', false, false, false
        );
    }

    /**
     * 首字母大写，驼峰
     *
     * @param string
     * @return
     */
    public static String getHumpFirstUpper(String string) {
        return GuoUtilsVariableName.getCustom(
                string,'\0',false,true,true
        );
    }

    /**
     * 首字母小写，驼峰
     *
     * @param string
     * @return
     */
    public static String getHumpFirstLower(String string) {
        return GuoUtilsVariableName.getCustom(
                string,'\0',false,true,false
        );
    }


    /**
     * 自定义转换
     * 将一个英文句子转换，注意，必须是标准的英文句子（句子前面可以由空格，每个单词之间用空格隔开，','和'.'符号后面跟一个空格）
     * 如果原字符串中包含数字则直接保留，若原字符串中包含标点符号则直接删除
     * 原字符串中不得出现非ascii字符，原串末尾可以有标点符号但不可有空格
     *
     * @param string               原字符串（串前其他字符可以忽略，串后空格不会正常处理）
     * @param replace              替换空格的字符（当设置为'\0'时，表示直接去掉原串的空格）
     * @param isAllUpper           是否将全部字母大写
     * @param isWordFirstUpper     是否将每个单词的首字母大写
     * @param isSentenceFirstUpper 是否将这句话的首字母大写
     * @return 返回
     */
    public static String getCustom(
            String string, char replace,
            boolean isAllUpper, boolean isWordFirstUpper, boolean isSentenceFirstUpper) {
        StringBuilder result = new StringBuilder();
        char[] chars = string.toCharArray();
        int j = 0;
        // 去除前面无效字符，并对句子的首字母进行处理
        for (j = 0; j < chars.length; j++) {
            if (isNumberOrLetter(chars[j])) { // 去掉字母前面的无效字符
                if (isSentenceFirstUpper) {// 整句话的首字母是否转为大写
                    result.append(upperChar(chars[j]));
                } else {
                    result.append(lowerChar(chars[j]));
                }
                break;
            }
        }
        j++;
        for (int i = j; i < chars.length; i++) {
            if (isNumberOrLetter(chars[i])) { // 是否为字母数字，如果是其他字符则直接忽略
                if (isAllUpper) { // 是否全部转为大写
                    result.append(upperChar(chars[i]));
                } else {
                    result.append(lowerChar(chars[i]));
                }
            } else if (chars[i] == ' ') { // 是一个空格
                if (replace != '\0') { // 如果replace为\0表示忽略原串的空格
                    result.append(replace); // 替换空格
                }
                if (isWordFirstUpper) { // 每个单词的首字母是否转为大写
                    result.append(upperChar(chars[i + 1]));
                    i++;
                }
            }
        }
        return result.toString();
    }


    /**
     * 判断字符是否是数字或字母
     *
     * @param c
     * @return
     */
    public static boolean isNumberOrLetter(char c) {
        return 48 <= c && c <= 57 || 65 <= c && c <= 90 || 97 <= c && c <= 122;
    }

    /**
     * 字符转成大写
     *
     * @param c 需要转化的字符
     */
    public static char upperChar(char c) {
        if (97 <= c && c <= 122) {
            c ^= 32;
        }
        return c;
    }

    /**
     * 转为小写
     *
     * @param c
     * @return
     */
    public static char lowerChar(char c) {
        if (65 <= c && c <= 90) {
            c = (char) (c + 32);
        }
        return c;
    }

    public static void main(String[] args) {
        String source = "  ,,.. A HW888, is good.";
        //  String source = "SpringBoot configuration processor. Be careful with.";

        // A_HW888_IS_GOOD 常量
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '_', true, false, true
        ));
        System.out.println(getConstant(source));

        // a-hw888-is-good 中划线
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '-', false, false, false
        ));
        System.out.println(getBarbecue(source));

        // a_hw888_is_good 下划线
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '_', false, false, false
        ));
        System.out.println(getUnderline(source));

        // aHw888IsGood 驼峰首字母小写，java中的变量或方法名
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '\0', false, true, false
        ));
        System.out.println(getHumpFirstLower(source));

        // AHw888IsGood 驼峰首字母大写，java中的类名
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '\0', false, true, true
        ));
        System.out.println(getHumpFirstUpper(source));

        // ahw888isgood 去除空格全部小写
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '\0', false, false, false
        ));
        // AHW888ISGOOD 去除空格全部大写
        System.out.println(GuoUtilsVariableName.getCustom(
                source, '\0', true, true, true
        ));

    }
}
